package Question10_4;
public class Question {
/* Flip a positive sign to negative, or a negative sign to pos */
public static int FnNegate(int a) {
int neg = 0;
int d = a < 0 ? 1 : -1;
while (a != 0) {
neg += d;
a += d;
}
return neg;
}
/* Subtract two numbers by negating b and adding them */
public static int FnMinus(int a, int b) {
return a + FnNegate(b);
}
/* Check if a and b are different signs */
public static boolean DifferentSigns(int a, int b) {
return ((a < 0 && b > 0) || (a > 0 && b < 0)) ? true : false;
}
/* Return absolute value */
public static int abs(int a) {
if (a < 0) return FnNegate(a);
else return a;
}
/* Multiply a by b by adding a to itself b times */
public static int FnTimes(int a, int b) {
if (a < b) return FnTimes(b, a); // algo is faster if b < a
int sum = 0;
for (int iter = abs(b); iter > 0; --iter) sum += a;
if (b < 0) sum = FnNegate(sum);
return sum;
}
// returns 1, if a/b >= 0.5, and 0 otherwise
public static int DefineAndRoundFraction(int a, int b) {
if(FnTimes(abs(a), 2) >= abs(b)) return 1;
else return 0;
}
/* Divide a by b by literally counting how many times does b go into
* a. That is, count how many times you can subtract b from a until
* you hit 0. */
public static int FnDivide(int a, int b) throws java.lang.ArithmeticException {
if (b == 0) {
throw new java.lang.ArithmeticException("ERROR: Divide by zero.");
}
int quotient = 0;
int divisor = FnNegate(abs(b));
int divend; /* dividend */
for (divend = abs(a); divend >= abs(divisor); divend += divisor) {
++quotient;
}
if (DifferentSigns(a, b)) quotient = FnNegate(quotient);
return quotient;
}
public static int randomInt(int n) {
return (int) (Math.random() * n);
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
int a = randomInt(10);
int b = randomInt(10);
int ans = FnMinus(a, b);
if (ans != a - b) {
System.out.println("ERROR");
}
System.out.println(a + " - " + b + " = " + ans);
}
for (int i = 0; i < 100; i++) {
int a = randomInt(10);
int b = randomInt(10);
int ans = FnTimes(a, b);
if (ans != a * b) {
System.out.println("ERROR");
}
System.out.println(a + " * " + b + " = " + ans);
}
for (int i = 0; i < 100; i++) {
int a = randomInt(10) + 1;
int b = randomInt(10) + 1;
System.out.print(a + " / " + b + " = ");
int ans = FnDivide(a, b);
if (ans != a / b) {
System.out.println("ERROR");
}
System.out.println(ans);
}
}
}